/*
 * ColeccionDeBits.h
 *
 *  Created on: 28/11/2012
 *      Author: d
 */

#ifndef COLECCIONDEBITS_H_
#define COLECCIONDEBITS_H_
#include <vector>
#include <string>
#include <math.h>
#include "../common_components/physical_layer_commons.h"
#include "Constantes.h"

class Utilidades;

using namespace std;

class ColeccionDeBits {
private:
	std::vector<int>* coleccionDeBits;
	Utilidades* utilidades;
	int obtenerRepresentacionDecimal();
	int potenciaBaseDos(int numeroDecimal);
	void removerElementoDelPrincipioCantidad(int valor);
public:
	ColeccionDeBits();

	/**
	 *.
	 * @return un vector de enteros que pueden tomar el valor 0 o 1
	 */
	std::vector<int>* obtenerColeccionDeBits();

	/**
	 *
	 * @return la representación decimal del numero binario representado por la colección de bits
	 */
	int obtenerRepresentacionDecimalDeLaColeccion();
	
	void compresionAIzquierda(int tamanio);
	
	void concatenarCon(ColeccionDeBits* otraColeccionDeBits);

	bool hayUnCeroEnPosicion(int posicion);
	
	int obtenerElementoEnPosicion(int posicion);
	
	ColeccionDeBits* obtenerPrimerosCuatroBits();
	
	ColeccionDeBits* obtenerCuatroBitsConsecutivos(int inicio);
	
	void agregarElementoAlFinal(int elemento);

	void agregarElementoAlInicio(int elemento);
	
	//metodos que se utilizaran para la compresion

	/**
	 *
	 * @param cantidadDeVeces veces que agregara los bits en 1 en la coleccion
	 */
	void agregarUnosAlFinal(int cantidadDeVeces);

	
	void agregarCerosAlFinal(int cantidadDeVeces);
	
	/**
	 * agrega un cero en la ultima posicion de la coleccion
	 */
	void agregarUnCeroAlFinal();

	/**
	 *agrega un uno en la ultima posicion de la coleccion
	 */
	void agregarUnUnoAlFinal();

	//metodos que se utilizaran para la decompresion

	/**
	 * -
	 * @return devuelve el ultimo elemento de la coleccion
	 * 		   y lo extrae de la misma
	 * 		   (en consecuencia el tamaño de la coleccion disminuye)
	 */
	int extraerUltimoBit();

	/**
	 * -agrega un cero en la primer posicion de la coleccion
	 */
	void agregarUnCeroAlPrincipio();

	/**
	 * -agrega un uno en la primer posicion de la coleccion
	 */
	void agregarUnUnoAlPrincipio();

	/**
	 * elimina el ultimo bit de la coleccion
	 */
	void eliminarElUltimoBit();

	/**
	 *
	 * @return el tamanio de la coleccion de bits
	 */
	int tamanio();
	
	virtual ~ColeccionDeBits();
};

#endif /* COLECCIONDEBITS_H_ */
